/**
 *  @file CircleSinglelink.c
 *  @desc 实现循环单链表的基本操作：初始化、插入、删除、打印、销毁等
 *  @author WangBlue(wangjiping596@gmail.com)
 *  @date 2025-07-23 10:44
 *  @version 1.0
 */

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// 定义链表节点结构体
typedef struct node {
    int data;
    struct node *next;
} node, *link;

/**
 * 初始化循环单链表，创建头结点并自环
 */
void initNode(link *head) {
    link newNode = (link)malloc(sizeof(node));
    if (newNode == NULL) return;
    newNode->data = 0;
    newNode->next = newNode;  // 自环构成循环
    *head = newNode;
}

/**
 * 创建普通数据节点
 */
link createNode(int value) {
    link newNode = (link)malloc(sizeof(node));
    if (newNode == NULL) return NULL;
    newNode->data = value;
    newNode->next = NULL;
    return newNode;
}

/**
 * 头插法：将新节点插入头节点之后
 */
void istHead(link head, int value) {
    link newNode = createNode(value);
    if (newNode == NULL) return;
    newNode->next = head->next;
    head->next = newNode;
}

/**
 * 尾插法：将新节点插入到尾部（头节点前面）
 */
void istTail(link head, int value) {
    link newNode = createNode(value);
    if (newNode == NULL) return;
    link cur = head;
    while (cur->next != head) {
        cur = cur->next;
    }
    cur->next = newNode;
    newNode->next = head;
}

/**
 * 打印链表所有数据节点
 */
void printList(link head) {
    if (head == NULL || head->next == head) return;  // 空表
    link cur = head->next;
    while (cur != head) {
        printf("value is %d\n", cur->data);
        cur = cur->next;
    }
    printf("\n");
}

/**
 * 按位置删除第 pos 个数据节点（位置从 1 开始，不含头节点）
 */
void delByPos(link head, int pos) {
    if (head == NULL || head->next == head || pos < 1) return;
    link cur = head;
    int idx = 0;
    while (cur->next != head && idx < pos - 1) {
        cur = cur->next;
        idx++;
    }
    if (cur->next == head) return;  // 删除位置非法
    link delNode = cur->next;
    cur->next = delNode->next;
    free(delNode);
}

/**
 * 销毁整个循环链表，释放所有节点
 */
void destroy(link *head) {
    if (*head == NULL) return;
    link cur = (*head)->next;
    link temp;
    while (cur != *head) {
        temp = cur->next;
        free(cur);
        cur = temp;
    }
    free(*head);      // 释放头节点
    *head = NULL;     // 避免悬空指针
}

/**
 * 主函数，演示链表基本操作
 */
int main() {
    link head = NULL;
    initNode(&head);

    istHead(head, 1);
    istHead(head, 2);
    istHead(head, 3);

    // delByPos(head, 1);  // 删除第一个数据节点（1）

    // destroy(&head);
    printList(head);    // 安全：此时 head = NULL，不输出
}
